package com.epin.util;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang3.StringUtils;

import com.epin.base.defaults.RegexPattern;


/**
 * 数字处理帮助类
 * @author Likeyong
 * @Date 2016年10月19日
 */
public class NumberHelper {
	
	

	public static Integer add(Integer a,Integer b){
		if(a!=null && b!=null){
			return a+b;
		}else if(a==null && b!=null){
			return b;
		}
		return a;
	}
	public static Double doubleSubtract(Double a,Double b){
		if(b!=null){
			 BigDecimal b1 = new BigDecimal(Double.toString(a));  
		        BigDecimal b2 = new BigDecimal(Double.toString(b));  
		        return b1.subtract(b2).doubleValue();  
		}
		return a;
	}
	public static Double doubleAdd(Double a,Double b){
		if(b!=null){
			BigDecimal b1 = new BigDecimal(Double.toString(a));  
		    BigDecimal b2 = new BigDecimal(Double.toString(b));  
		    return b1.add(b2).doubleValue();  
		}
		return a;
	}
	
	public static String divideFormat(String num1, String num2, int scale){
		String result = "";
		
		if(num1!=null && num2!=null){
			BigDecimal b1 = new BigDecimal(num1);
			BigDecimal b2 = new BigDecimal(num2);
			if(b2.doubleValue()!=0){
				return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).toString();
			}
		}
		
		return result;
	}
	
	public static Integer add(Integer a,Double b){
		if(a!=null && b!=null){
			return (int) (a+b);
		}else if(a==null && b!=null){
			return (int) (0+b);
		}
		return a;
	}
	public static Integer adds(Integer... as){
		Integer total=0;
		if(as!=null && as.length>0 ){
			for(Integer a:as){
				if(a!=null){
					total +=a;
				}
			}
		}
		return total;
	}
	public static Double adds(Double... as){
		Double total=0d;
		if(as!=null && as.length>0 ){
			for(Double a:as){
				if(a!=null){
					total =doubleAdd(total ,a);
				}
			}
		}
		return total;
	}
	public static Double minus(Double total,Double... as){
		if(as!=null && as.length>0 ){
			for(Double a:as){
				if(a!=null){
					total =doubleSubtract(total,a);
				}
			}
		}
		return total;
	}
	
	public static Double add(Double a,Double b){
		if(a!=null && b!=null){
			return a+b;
		}else if(a==null && b!=null){
			return b;
		}
		return a;
	}
	
	public static Double divide(Double a,Double b){
		if(a!=null && b!=null){
			return a/b;
		}
		return a;
	}
	
	/** 去掉小数点后面多余的0 **/
	public static String dropZero(String str){
		if(StringUtils.isNotBlank(str)){
			//正则匹配: 当前字符串最后是以 .0000... 结尾
			if(str.matches("[0-9]+\\.[0]*")){
				//System.out.println("匹配成功");
				return str.substring(0, str.indexOf("."));
			}
		}
		return str;
	}
	
	public static Boolean checkNumber(String s){
		if(s!=null){
			Pattern pattern = Pattern.compile(RegexPattern.getDouble()); 
			Matcher isNum = pattern.matcher(s);
			if( !isNum.matches() ){
				return false; 
		    } 
		    return true;
		}else{
			return false;
		}
	}
	/**
	 * 数字转字符
	 * @param d
	 * @return
	 */
	public static String intToString(Integer d){
		if(d!=null){
			return d.toString();
		}
		return null;
	}
	/**
	 * 数字转字符
	 * @param d
	 * @return
	 */
	public static String doubleToString(Double d){
		if(d!=null){
			return d.toString();
		}
		return null;
	}
	/**
	 * 字符串转double
	 * @param str
	 * @return
	 */
	public static Double stringToDouble(String str){
		if(str!=null&&!"".equals(str)){
			return Double.parseDouble(str);
		}
		return null;
	}
	/**
	 * 字符串转Integer
	 * @param str
	 * @return
	 */
	public static Integer stringToInteger(String str){
		if(str!=null&&!"".equals(str)){
			return Integer.parseInt(str);
		}
		return null;
	}
	
	public static Double intToDouble(Integer i){
		if(i!=null){
			return i.doubleValue();
		}
		return null;
	}
	
	/////////////////////////小数点_start/////////////////////////////


	public static Integer checkDecimalNo(Number d){
         String s = d + "";
    	 int position=0;
    	 String[] ss=s.split("\\.");
         if(ss.length==2&&ss[1]!=null){
        	 position=ss[1].length();
         }
         return position;
	}
	/**
	 * 小数点后保留多少位
	 * @param d
	 * @param i
	 * @return
	 */
	public static Double rounding(Double d,Integer i){
		if(d!=null && checkDecimalNo(d)>i){
			if(i==null || i<0){//如果小数点后位数异常，则不保留小数
				i=0;
			}
			BigDecimal bd = new BigDecimal(d);
			bd = bd.setScale(i,BigDecimal.ROUND_HALF_UP);
			return bd.doubleValue();
		}else{
			return d;
		}
	}
	public static BigDecimal rounding(BigDecimal d,Integer i){
		if(d!=null && checkDecimalNo(d)>i){
			if(i==null || i<0){//如果小数点后位数异常，则不保留小数
				i=0;
			}
			d = d.setScale(i,BigDecimal.ROUND_HALF_UP);
			return d;
		}else{
			return d;
		}
	}
	/**
	 * 小数点后保留多少位
	 * @param d
	 * @param i
	 * @return
	 */
	public static String rounding(String s,Integer i){
		if(!StringUtils.isEmpty(s)&&NumberHelper.checkNumber(s)){
			BigDecimal d = new BigDecimal(s);
			return String.valueOf(rounding(d,i));
		}else{
			return s;
		}
	}
	/**
	 * 凑数取整
	 * @param j
	 * @return
	 */
	public static Integer ceil(Double j){
		if(j!=null){
			return (int)Math.ceil(j);
		}
		return null;
	}
	/**
	 * 四舍五入取整
	 * @param k
	 * @return
	 */
	public static Integer round(Double k){
		if(k!=null){
			return (int)Math.round(k);
		}
		return null;
	}
	
	/** 将给定的Double进行格式化  **/
	public static String formatDouble(Double d){
		if(d!=null){
			DecimalFormat df=(DecimalFormat)NumberFormat.getInstance();
			//设置小数位最多为9位
			df.setMaximumFractionDigits(9);
			df.setGroupingUsed(false);
			return df.format(d);
		}
		return "";
	}
	static DecimalFormat decimalFormat = new DecimalFormat("##0.00");//格式化设置 
	public static String doubleFormat(Double d){
		if(d!=null){
			return decimalFormat.format(d);
		}
		return null;
	}
	
	public static double format(Double d){
		BigDecimal b = d != null ? new BigDecimal(d) : new BigDecimal(0);
		double f1 = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
		return f1;
	}
	
	public static double format(BigDecimal d){
		d = d != null ? d : new BigDecimal(0);
		double f1 = d.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
		return f1;
	}
	
	public static String average(BigDecimal totalNo , BigDecimal no){
		if(totalNo!=null){
			return totalNo.divide(no,1, RoundingMode.HALF_UP).toString();
		}
		return "";
	}
	public static void main(String[] args) {
		BigDecimal a = new BigDecimal(2329);
		BigDecimal b = new BigDecimal(714);
		System.out.println(a.divide(b,1, RoundingMode.HALF_UP));
	}
}
